События являются объектами, унаследованными от класса QEvent, который представляет нечто, произошедшее внутри приложения или в результате внешней активности, о чем нужно знать приложению. События могут быть получены и обработаны любым экземпляром подкласса QObject, но главным образом они относятся к виджетам.
Как доставляются события
Когда происходит событие, то для его представления Qt создаёт объект события, создавая экземпляр соответствующего подкласса QEvent, и доставляет его отдельному экземпляру класса QObject (или одного из его подклассов), вызывая его функцию event().
Эта функция не обрабатывает событие сама; основываясь на типе доставленного события, она вызывает обработчик событий для данного конкретного типа события и отправляет ответ на основе того, будет ли событие принято или проигнорировано.
Некоторые события, например, QMouseEvent и QKeyEvent, поступают из оконной системы; некоторые, например, QTimerEvent, поступают из других источников; некоторые поступают из самого приложения.
Типы событий
Большинство типов событий имеют специальные классы, а именно:
Тип события | Класс события |
---|---|
QEvent::ActionAdded | QActionEvent |
QEvent::ActionChanged | QActionEvent |
QEvent::ActionRemoved | QActionEvent |
QEvent::ChildAdded | QChildEvent |
QEvent::ChildPolished | QChildEvent |
QEvent::ChildRemoved | QChildEvent |
QEvent::Close | QCloseEvent |
QEvent::DragEnter | QDragEnterEvent |
QEvent::DragLeave | QDragLeaveEvent |
QEvent::DragMove | QChildEvent |
QEvent::Drop | QDropEvent |
QEvent::Enter | QEnterEvent |
QEvent::FileOpen | QFileOpenEvent |
QEvent::FocusIn | QFocusEvent |
QEvent::FocusOut | QFocusEvent |
QEvent::FocusAboutToChange | QFocusEvent |
QEvent::Hide | QHideEvent |
QEvent::HoverEnter | QHoverEvent |
QEvent::HoverLeave | QHoverEvent |
QEvent::HoverMove | QHoverEvent |
QEvent::IconDrag | QIconDragEvent |
QEvent::InputMethod | QInputMethodEvent |
QEvent::InputMethodQuery | QInputMethodQueryEvent |
QEvent::KeyPress | QKeyEvent |
QEvent::KeyRelease | QKeyEvent |
QEvent::MouseButtonDblClick | QMouseEvent |
QEvent::MouseButtonPress | QMouseEvent |
QEvent::MouseButtonRelease | QMouseEvent |
QEvent::MouseMove | QMouseEvent |
QEvent::Move | QMoveEvent |
QEvent::Paint | QPaintEvent |
QEvent::Resize | QResizeEvent |
QEvent::ScrollPrepare | QScrollPrepareEvent |
QEvent::Scroll | QScrollEvent |
QEvent::Shortcut | QShortcutEvent |
QEvent::ShortcutOverride | QKeyEvent |
QEvent::Show | QShowEvent |
QEvent::Timer | QTimerEvent |
QEvent::ToolTip | QHelpEvent |
QEvent::Wheel | QWheelEvent |
QEvent::WindowStateChange | QWindowStateChangeEvent |
Каждый класс создан как подкласс QEvent и добавляет функции, зависимые от события. Например, QResizeEvent добавляет функции size() и oldSize(), чтобы разрешить виджетам узнать как изменились их размеры.
Некоторые классы поддерживают более одного реального типа событий. QMouseEvent поддерживает щелчки кнопкой мыши, двойные щелчки, перемещение и другие связанные операции.
Каждое событие имеет связанный с ним тип, который можно получить, обратившись к функции type(). Это может быть использовано в качестве удобного источника информации о типах во время выполнения для быстрого определения подкласса данного объекта события.
Поскольку программам нужно реагировать разными и сложными способами, механизмы доставки событий являются гибким.
Обработчики событий
Обычный способ доставки события - вызов виртуальной функции. Например, событие QMoveEvent доставляется вызовом
QWidget::moveEvent($event)
. Эта виртуальная функция вызывается когда виджет перемещается на новую позицию.
Если в своей реализации виртуальной функции вы не выполнили всю необходимую работу, вам может понадобиться вызывать
реализацию из базового класса: parent::moveEvent($event)
.
Например, следующий код обрабатывает щелчки левой кнопкой мыши на пользовательском виджете в то время, как щелчки остальными кнопками передаются в базовый класс QWidget:
# QMouseEvent
class Widget extends QWidget {
private $count = 0;
/** @override mousePressEvent */
public function mousePressEvent($event) {
switch ($event->button()) {
case Qt::LeftButton:
// здесь обрабатываем левую кнопку мыши
$this->count++;
echo "Left button click counts: {$this->count}";
break;
default:
// передаём остальные кнопки в базовый класс
QWidget::mousePressEvent($event);
}
}
}
Неотъемлемой частью реализации обработчиков событий является аннотация @override
с указанием имени
переопределяемой виртуальной функции.